package com.xiaoge.web;

import com.xiaoge.config.WebAppConfig;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.Wrapper;
import org.apache.catalina.startup.Tomcat;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.ServletRegistration;

/**
 * TODO
 *
 * @author <a href="mailto:1330137071@qq.com">Zhang Xiao</a>
 * @since
 */
public class SpringApplication {

	/**
	 * todo 自动模式, MyInitializer方法由Tomcat调用
	 * @throws LifecycleException
	 */
	public static void run() throws LifecycleException {
		Tomcat tomcat = new Tomcat();
		tomcat.setPort(9898);
		// todo 告诉tomcat是个web项目, 要不然tomcat不会走servlet规范, 调用ServletContainerInitializer接口的实现类
		// todo 但是当你会用addWebapp 报错ClassNotFoundException: org.apache.jasper.servlet.JspServlet  因为addWebapp, tomcat就任务你里面包含了jsp(tomcat就是这么设计的, 在启动的时候就会去调用jsp的处理引擎)
		// todo 虽然报错JspServlet不影响正常使用
		tomcat.addWebapp("/", "D:\\temp\\");
		tomcat.start();
		tomcat.getServer().await();
	}

	/**
	 * todo 手动调用解决报错: ClassNotFoundException: org.apache.jasper.servlet.JspServlet
	 * @throws LifecycleException
	 */
	public static void run2() throws LifecycleException {
		Tomcat tomcat = new Tomcat();
		tomcat.setPort(9898);
		tomcat.addContext("/", "D:\\temp\\");
		tomcat.start();

		AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
		context.register(WebAppConfig.class);

		/*
		 	todo: 如果你加了这样代码, 它会去解析 WebAppConfig配置类上面的@EnableWebMvc注解, 而它需要再DispatcherServlet实例化之后执行
		 		所以, 我们不能再这里初始化spring容器, 直接注释掉就行, 因为DispatcherServlet底层会去初始化spring容器, 它会去调用refresh方法去初始化spring容器

		 		todo: 或者DispatcherServlet初始化之后执行refresh方法, DispatcherServlet也有refresh方法, 因为父类FrameworkServlet有refresh方法
		 */
		// context.refresh();

		DispatcherServlet servlet = new DispatcherServlet(context);

		// todo spring boot 获取servletContext方式相当复杂, 为了解决ClassNotFoundException: org.apache.jasper.servlet.JspServlet这个问题
		Wrapper app = tomcat.addServlet("/", "app", servlet);
		app.setLoadOnStartup(1);
		app.addMapping("/app/*");


		tomcat.getServer().await();
	}


}
